iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

今天目標是將 MySQL 建立起來,這邊我是用最簡單的 module 建立的。要注意 GCP 的 SQL 預設是會給予 Public IP,但儘管是 Public ,你一樣可以用 authorization 的方式限定取用的 SA。如果你想要只保持私人 IP,你可以設定 ipv4_enabled = false

module "safer-mysql-db" {
  source     = "terraform-google-modules/sql-db/google//modules/mysql"
  version    = "~> 21.0"
  project_id = var.project_id
  region     = var.region

  name = local.resource_names.sql

  random_instance_name = true

  deletion_protection = false

  database_version = "MYSQL_8_0"
  zone             = "asia-east1-c"
  tier             = "db-n1-standard-1"
  # ssl = false
  ip_configuration = {
    require_ssl                                   = false # 設置為 false 允許非 SSL 連接
    private_network                               = module.vpc.network_self_link
    allocated_ip_range                            = module.private-service-access.google_compute_global_address_name
    enable_private_path_for_google_cloud_services = true
    ipv4_enabled                                  = false // 關閉 IPv4(public ip)
    authorized_networks                           = []    # 如果需要,可以在這裡添加授權網絡
  }

  # // Cloud SQL proxy.
  additional_users = [
    {
      name            = "alvinlin"
      password        = "123123"
      host            = "%"
      type            = "BUILT_IN"
      random_password = false
    },
  ]

  // Optional: used to enforce ordering in the creation of resources.
  module_depends_on = [module.private-service-access.peering_completed]
}


測試方法一樣是進入有 IPA 的 Instance,然後進行連線測試,這邊連線是直接使用 telnet,如果你看到 Connected to xxx,代表可以連線。

gcloud compute ssh bi-portal-test-vm-alvin \
    --project=xxx \
    --zone=asia-east1-a \
    --tunnel-through-iap;
 telnet 10.89.0.5 3306
Trying 10.89.0.5...
Connected to 10.89.0.5.

然後你可以使用 mysql -h -p,然後輸入密碼,帳密是剛剛設定的

  additional_users = [
    {
      name            = "alvinlin"
      password        = "xxxx"
      host            = "%"
      type            = "BUILT_IN"
      random_password = false
    },
  ]

要注意不要被 GPT 騙而設定到 host "localhost"。這意味著該用戶只能從數據庫服務器本身進行本地連接,而不能從其他機器(如您的 VM)進行遠程連接。可惡!

還有就是 GCP 在 console 有很貼心的幫你建立一套工具叫 connectivity tests ,可以進行連線測試。這東西在 redis 的測試上省了很多時間。但是當你在測試 SQL,且你是走 direct access 的時候,他是一坨大便。我一直跑不過,然後跑出下圖。

https://ithelp.ithome.com.tw/upload/images/20240923/201185251694Xeah7F.png

但是我實際上新的 image 做連線測試,其實是可行的。多浪費我三個多小時排查防火墻,亙。

func initDB() {
	dbHost := os.Getenv("DB_HOST")
	if dbHost == "" {
		dbHost = "10.89.0.8"
	}
	dbUser := os.Getenv("DB_USER")
	if dbUser == "" {
		dbUser = "xxxxx"
	}
	dbPass := os.Getenv("DB_PASSWORD")
	if dbPass == "" {
		dbPass = "123123"
	}
	dbName := os.Getenv("DB_NAME")
	if dbName == "" {
		dbName = "default" // 請替換為實際的數據庫名稱
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", dbUser, dbPass, dbHost, dbName)
	var err error
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		log.Fatalf("Error opening database connection: %v", err)
	}

	// 測試數據庫連接
	err = db.Ping()
	if err != nil {
		log.Fatalf("Error connecting to the database: %v", err)
	}

	log.Println("Successfully connected to the database")

https://ithelp.ithome.com.tw/upload/images/20240923/20118525ML9rROYKG1.png


上一篇
GCP ALB 整理
下一篇
資安 Certificate IaC
系列文
從 AWS 轉生到 GCP 世界,還順便轉職成 DevOps 的 SRE30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言